ラインスキャン画像の Scaling

概要

ファイル: \examples\Processing\Geometry\ScalingLine\ScalingLineP16.va
\examples\Processing\Geometry\ScalingLine\ScalingLineP8.va

デフォルトプラットフォーム: mE5-MA-VCL

簡単な説明

ラインスキャン画像のScalingと変換

VisualAppletsデザイン「ScalingLineP8.va」および「ScalingLineP16.va」は、CameraLink Full構成のラインスキャンカメラの画像を任意の係数でScalingし、入力と出力の間で画像幅を変換します。「ScalingLineP8.va」はParallelism 8用に、「ScalingLineP16.va」はmarathon VCLプラットフォーム用のParallelism 16で設計されています。 本書では、VisualAppletsにおけるアルゴリズムと実装について説明します。デザインを使用するには、いくつかのルックアップテーブル値を計算する必要があります。 付属のC++およびMatlabプログラムにより、これらの計算が行われるため、簡単にご利用いただけます。

ラインにおける Scaling/変換の基本概念

ライン画像のScaling/変換/Distortion Correctionは、ソースおよびターゲットの画像座標に基づいて実行されます。 以下では、アルゴリズムの基本原理を座標ペアの例とParallelism 4を使用して説明します。

ターゲット座標: 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13 14 15
ソース座標: 0.3 0.5 1.4 1.5 | 2.2 3.4 3.6 4.2| 5.4 5.5 7.8 8.5 | 9.1 11.4 13.3 14.1

Target-To-Source手順を使用します。ターゲット画像(= PCへの出力画像)内のすべてのピクセルについて、対応する(丸められた)整数座標と、ソース画像内の対応するピクセル値を選択します。ピクセル間の位置は、ソース画像内の現在のピクセル座標の先行するピクセル隣接も選択することで考慮されます。線形補間により、出力画像内の正しいピクセル値を計算します。 Parallelismのため、ソース画像から単一のピクセルを読み取ることはできません。したがって、「ワード」(同時に読み取られるピクセルの単位)を有用な順序で読み取る必要があります。 ワードを複数回読み取る必要が生じたり、全く読み取らない場合もあります。ソース画像から読み取られたこれらのワード内で、出力ワードを作成するための正しいピクセル位置を選択する必要があります。読み取られたワードから不要なピクセルは削除されます。次の例は、ソース画像座標からの読み取りアクセスを示しています。

Memory Read Countサイクル 要求されたターゲット座標 それぞれのソース座標 読み取りワード/ピクセルを含む ワード内のピクセルを使用
1 0, 1 2, 3 0.3, 0.5, 1.4, 1.5 0/ 0, 1, 2, 3 1, 1, 2, 2
2 4 2.2 0/ 0, 1, 2, 3 3, x, x, x
3 5, 6, 7, 8 3.4, 3.6, 4.2, 5.4 1/ 4, 5, 6, 7 4, 4, 5, 6
4 9 5.5 1/ 4, 5, 6, 7 6, x, x, x
5 10, 11, 12 7.8, 8.5, 9.1 2/ 8, 9, 10, 11 9, 8, 10, x
6 13, 14, 15 11.4, 13.3, 14.1 3 / 12, 13, 14, 15 12, 14, 15, x

表 24. 読み取りサイクル


「x」はピクセルが削除されることを示します。

VisualAppletsでの実装

デザインの主なコンポーネントは以下のとおりです(図 335):

1. トリガーシステムとバッファを含むラインスキャンカメラへのインターフェース;
2. カメラ画像のScaling(Transformation内);
3. PCへのDMAデータ転送;

ラインカメラ画像をScalingするための基本デザイン構造

図 335. ラインカメラ画像をScalingするための基本デザイン構造


以下では、メインコンポーネントであるTransformationについて詳しく説明します。

変換

図336に、変換の構成要素を示します。

変革の構成要素

図336.変換の構成要素


カメラのラインスキャン画像のスケーリングは、ターゲットからソースへの手順で実行されます。WordToRead では、入力カメラ画像から 8 並列 (「ScalingLineP8.va」の 8 ) または 16 並列 (「ScalingLineP16.va」の 16 ) ピクセル (=「ワード」) の単位をどの有用な順序で読み取るかを選択します。PixelPicker では、読み取ったワードからどのピクセルが必要かを決定します。補間では、出力画像のピクセル値の計算に、ソース画像のピクセル間の位置が考慮されます。

WordToRead

WordToReadモジュールの構成要素を図337に示す。

WordToReadの構成要素

図337. WordToReadの構成要素


ソース画像から読み取る単語の順序と頻度は、 LUT: WordsToReadで定義されます。このテーブルの内容は、外部の C++ プログラム「ScalingLUTS.cpp」または MATLAB モジュール「LUTS_Scaling.m」および「ScalingTablelLine.m」を使用して作成されます。詳細については、該当セクションを参照してください。このドキュメントでは、このルックアップ テーブルの入力リンクはCreateBlankImageとCoordinate_Xで定義されています。CreateBlankImage のImageWidthパラメータの値は、LUT: WordsToReadの要素数と完全に一致する必要があります。ImageHeightパラメータはCreateBlankImageソース イメージの y 方向の画像寸法と一致する必要があります。ソース イメージからのワードは、 LUT: WordsToReadで定義された順序で、バッファLineMemoryRandomRd_1とLineMemoryRandomRd_2から読み取られます。ソース イメージは、これらのバッファに線形に書き込まれます。ここでは、最大ビット深度が 64 ビット、並列度が 1 であるため、2 つのバッファが必要です。各ワードについて、前のワードの最後のピクセルが選択され、読み取られます ( SYNCの前の上の操作行)。この値は、 Merge演算子を使用して対応するワードに追加されます。

PixelPicker

PixelPickerモジュール(図338参照)では、読み取った単語からPick_0からPick_15 (並列度8の場合はPick_7まで)のコンポーネントを使用して、スケーリングされた出力単語のピクセルが選択されます。読み取った単語のピクセルが不要な場合(セクションを参照)ルックアップテーブルRemovePixelそれらを削除します。上記のテーブル ( Pick_0 ~ Pick_15およびRemovePixel ) の内容は、外部 C++ プログラム「ScalingLUTS.cpp」または MATLAB モジュール「LUTS_Scaling.m」および「ScalingTablelLine.m」を使用して作成できます。詳細については、次のセクションも参照してください。この文書において。

PixelPickerの構成要素

図338. PixelPickerの構成要素


図339には HierarchicalBox Pick_0の内容が示されています。ルックアップ テーブルPickComponent0 は、読み取られたワード ( SelectFromParallel: WordおよびCoordinate_X: Number ) のどのピクセルが現在の出力ワードの 0. コンポーネントであるかを定義します。演算子CASEにより、対応するピクセルが選択されます。選択されたピクセルは、その前のピクセルとともに現在のピクセルに書き込まれます ( MergePixel )。この手順と同様に、現在の出力ワードのピクセル 1 ~ 15 (または並列度 8 の場合は 7) がモジュールPick_1 ~ Pick_15 (またはPick_7まで) で選択されます。個々のピクセルPick_0 ~ Pick_15 (またはPick_7まで) は、並列度 16 または 8 で現在の変換/スケーリングされたワードに結合されます (図338のMergeParallel )。

Pick_0の内容

図339. Pick_0の内容


補間

PCに送信される出力画像のピクセル位置の正しい値を取得するには、ソース画像のピクセル間隔を考慮する必要があります。補間モジュール(図336 )では、線形補間が実行されます[ Bur06 ]。

式30。


ここで、 は出力画像のピクセル値であり、値に対応します。 元画像の位置xにおいて。さらに および ピクセル座標における値は および ソース画像では、ピクセル間の位置は 線形補間に関する詳細情報は、例えば[Bur06].

モジュールのコンテンツは 補間 図に示されています 340。 現在のピクセルの値 とその 先行ピクセル は、演算子によって分離されます SelectBitField: Current および SelectBitField: Previous。
の値 および は、式に基づいて次と乗算されます および 。
中間画素位置の情報 30は、4つのLUTに含まれています Fractional_Part0 Fractional_Part3 を のデザイン「ScalingLineP16.va」内。
各テーブルには、現在の出力ワードの 4 ピクセルに対する中間画素位置が含まれています
。
すべての中間画素位置のビット深度は 6 ビットです。
LUTの内容 は、外部の C++ プログラム「ScalingLUTS.cpp」、または代替として MATLAB モジュール「LUTS_Scaling.m」および「ScalingTablelLine.m」を使用して作成できます。
このドキュメントの Fractional_Part3 を のデザイン「ScalingLineP16.va」内。
各テーブルには、現在の出力ワードの 4 ピクセルに対する中間画素位置が含まれています
外部C++プログラム「ScalingLUTS.cpp」またはMATLABモジュール「LUTS_Scaling.m」および「ScalingTablelLine.m」を使用して作成できます。詳細については、次のセクションも参照してください。 セクションも参照してください。

デザイン「ScalingLineP8.va」には、中間画素位置を含む Fractional テーブルが 1 つあります。
そのコンテンツは、外部の C++ および MATLAB プログラムモジュールを使用して作成することもできます。
最後に、変換/Scaling されたライン画像が DMA 転送によって PC に送信されます(図 336を使用します。

補間のコンポーネント

図 340:補間のコンポーネント


VisualApplets デザイン用 Lookup Table

デザイン「ScalingLineP16.va」および「ScalingLineP8.va」に必要な LUT(セクション を参照)は、C++ プログラム「ScalingLUTs.cpp」(「LUTS_Cpp」フォルダ内)、または MATLAB プログラムモジュール「LUTS_Scaling.m」および「ScalingTableLine.m」(「LUTS_MATLAB」フォルダ内)を使用して作成できます。

ScalingLUTs.cpp

1. プログラム内(またはコマンドプロンプト内)で次のパラメータを定義してください:

//////////////////////Parameter////////////////////

/ これらのパラメータを指定してください!//////////////////

uint64_t parallelism = 8; // =8("ScalingLineP8.va"の場合)、=16("ScalingLineP16.va"の場合)

uint64_t fractionalBits = 6; // = 6: "ScalingLineP8.va"および"ScalingLineP16.va"におけるデフォルト値

uint64_t noOfFractionalLUTs = parallelism == 8 ? 1 : 4; // 小数テーブルの数 = "ScalingLineP8.va"では1、 = "ScalingLineP16.va"では4

int InputWidth; // 入力画像の幅

int OutputWidth; // PCに送信される画像の幅

VisualAppletsデザイン「ScalingLineP16.va」の場合はparallelismパラメータを16に設定し、「ScalingLineP8.va」の場合は8に設定します。 両方のデザインにおいて、fractionalBitsの数6はデフォルトの 値です。「ScalingLineP16.va」のデザインには、 補間のための画素間位置を含む4つのテーブル (const int noOfFractionalLUTs = 4)があります(図340を参照)。 代わりに、「ScalingLineP8.va」のデザインには1つのテーブル (const int noOfFractionalLUTs = 1)があります。ライン画像のスケーリングは、InputWidthとOutputWidthの関係によって定義されます。

2. プログラムを実行します。

3. VisualAppletsデザインのルックアップテーブルにロードできる次のファイルが作成されます:

ファイル VA LUT
FractionalTable_0.txt 〜 FractionalTable_3.txt Fractional_Part0(またはparallelismが8の場合はFractional)〜 FractionalPart_3
PickerTable_0.txt 〜 PickerTable_15.txt(または PickerTable_7.txt まで) PickComponent0 〜 PickComponent15(または PickComponent7 まで)
TableWordsToRead.txt WordsToRead
RemoveTable.txt RemovePixel

表25:VisualAppletsのファイルとそれに対応するルックアップテーブル


さらに、テキストファイル ScalingTable.txt が作成されます。これには、出力画像ピクセルごとの、 ソース画像における対応する座標が含まれています(セクション も参照してください)。

ScalingTableLine.m および LUTS_Scaling.m

モジュール「ScalingTableLine.m」を開き、パラメータを定義してください

InputWidth=…;

OutputWidth=…;

1. プログラムを実行します。

2. テキストファイル ScalingTableLine.txt が作成されます。これには、出力画像ピクセルごとの ソース画像における対応する座標が含まれています。

3. モジュール「LUTS_Scaling.m」を開き、パラメータを定義してください

parallelism = ...;

NoOfFractionalBits=...;

NoOfFractionalTables=...;

プログラムを実行してください!作成されたファイルは、VisualAppletsのデザイン内のルックアップテーブルにロードできる表 25 のファイルに対応しています。